/**
 * 
 */
package cl.hhha.web.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import org.hibernate.annotations.Index;


/**
 * Modela la información del solicitante ciudadano para el formulario OIRS
 * @author Óscar Álvarez V
 * @email oialvarez@gmail.com
 * @Version 1.0
 * @date 24-06-2009 14:19:23
 */
@Entity
@Table(name="wsap_solicitante")
@NamedQueries ({
    @NamedQuery(
        name = "buscarSolicitantePorRut",
        query = "from Solicitante where rut = :rut "
        )
})
//SequenceGenerator(name="wsap_seq_solicitante", sequenceName="wsap_seq_solicitante")
public class Solicitante extends BaseObject implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy=GenerationType.AUTO)//SEQUENCE, generator="wsap_seq_solicitante")
	private Long id;
	
	@Column(nullable=false, length=9, unique=true)
	@Index(name="wsap_solicitante_rut_index")
	private Integer rut;
	
	@Column(nullable=false, length=1)
	private String dv;
	
	@Column(nullable=false, length=100)
	private String nombres;
	
	@Column(nullable=false, length=50)
	private String apellidoPaterno;
	
	@Column(nullable=false, length=50)
	private String apellidoMaterno;
	
	/**
	 * El sexo del participante que se representará mediante dos valores:
	 * F cuando el participante sea del sexo femenino
	 * M cuando el participante sea del sexo masculino
	 */
	@ManyToOne
	@JoinColumn(nullable=false)
	private Sexo sexo;
	
	@Column(nullable=false)
	@Index(name="wsap_solicitante_ticket_index")
	private Integer ticket;
	
	
	@Embedded
	private Telefono telefono;
	
	@Embedded 
	private Direccion direccion;
	
	@Embedded
	private Correo correo;
	
	
	
	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @return the rut
	 */
	public Integer getRut() {
		return rut;
	}

	/**
	 * @param rut the rut to set
	 */
	public void setRut(Integer rut) {
		this.rut = rut;
	}

	/**
	 * @return the dv
	 */
	public String getDv() {
		return dv;
	}

	/**
	 * @param dv the dv to set
	 */
	public void setDv(String dv) {
		this.dv = dv;
	}

	/**
	 * @return the nombres
	 */
	public String getNombres() {
		return nombres;
	}

	/**
	 * @param nombres the nombres to set
	 */
	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	/**
	 * @return the apellidoPaterno
	 */
	public String getApellidoPaterno() {
		return apellidoPaterno;
	}

	/**
	 * @param apellidoPaterno the apellidoPaterno to set
	 */
	public void setApellidoPaterno(String apellidoPaterno) {
		this.apellidoPaterno = apellidoPaterno;
	}

	/**
	 * @return the apellidoMaterno
	 */
	public String getApellidoMaterno() {
		return apellidoMaterno;
	}

	/**
	 * @param apellidoMaterno the apellidoMaterno to set
	 */
	public void setApellidoMaterno(String apellidoMaterno) {
		this.apellidoMaterno = apellidoMaterno;
	}

	/**
	 * @return the telefono
	 */
	public Telefono getTelefono() {
		return telefono;
	}

	/**
	 * @param telefono the telefono to set
	 */
	public void setTelefono(Telefono telefono) {
		this.telefono = telefono;
	}

	/**
	 * @return the direccion
	 */
	public Direccion getDireccion() {
		return direccion;
	}

	/**
	 * @param direccion the direccion to set
	 */
	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}

	/**
	 * @return the correo
	 */
	public Correo getCorreo() {
		return correo;
	}

	/**
	 * @param correo the correo to set
	 */
	public void setCorreo(Correo correo) {
		this.correo = correo;
	}

	/**
	 * @return the sexo
	 */
	public Sexo getSexo() {
		return sexo;
	}

	public Integer getTicket() {
		return ticket;
	}

	public void setTicket(Integer ticket) {
		this.ticket = ticket;
	}

	/**
	 * Se requiere que el dato sea F o M, de lo contrario se lanzará una excepción
	 * <code>IllegalArgumentException</code>
	 * @param sexo the sexo to set
	 * @throws IllegalArgumentException
	 */
	public void setSexo(Sexo sexo) throws IllegalArgumentException {
		this.sexo = sexo;
//		//se limpian espacios a izquierda y derecha.
//		sexo = null != sexo ? sexo.trim() : sexo;
//		
//		if("f".equalsIgnoreCase(sexo) || "m".equalsIgnoreCase(sexo)){
//			
//			
//			
//		} else {
//			
//			throw new IllegalArgumentException("Dato encontrado [" + sexo + "], " +
//					"se requería [F]emenino o [M]asculino, por favor corrija el solicitante con rut [" + rut + "]");
//			
//		}
		
	}

	/** Devuelve verdadero si los rut son iguales.
	 * @see cl.hhha.web.model.BaseObject#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object o) {
		
		if(o==this ){
			return true;
		}
		
		if( !(o instanceof Solicitante) ){
			return false;
		}
		
		final Solicitante s = (Solicitante)o;				
		return getRut() == null ? s.getRut() == null : getRut().equals(s.getRut());
		
	}

	/** Devuelve el hashcode del rut, 0 si el rut es nulo.
	 * @see cl.hhha.web.model.BaseObject#hashCode()
	 */
	@Override
	public int hashCode() {
		
		return rut != null ? rut.hashCode() << 2 : 0;
		
	}

	/** Transforma el objeto en rut y nombre completo.
	 * @see cl.hhha.web.model.BaseObject#toString()
	 */
	@Override
	public String toString() {
		
		return rut + "-" + dv + " " + nombres + " " + apellidoPaterno + " " + apellidoMaterno;
		
	}

	/**
	 * Determina si el solicitante tiene correo electronico
	 * @return true si el solicitante tiene correo electronico
	 */
	public Boolean tieneCorreoElectronico() {
		return getCorreo() != null && !"".equals(getCorreo().getCorreoElectronico()) ;
	}

	/**
	 * Determina si el solicitante tiene un ticket asignado.
	 * @return true si el solicitante tiene ticket asignado
	 */
	public boolean tieneTicket() {
		return getTicket() != null;
	}

}
